#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include<assert.h>
using namespace std;
//
//class Date {
//public:
//    int Getmonthday(int year, int month)
//    {
//        assert(month > 0 && month < 13);
//        int monthday[] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
//        if (month == 2 && (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
//            return 29;
//        return monthday[month];
//    }
//    Date& operator+=(int day)
//    {
//        _day += day;
//        while (_day >= Getmonthday(_year, _month))
//        {
//            _day -= Getmonthday(_year, _month);
//            _month++;
//            if (_month == 13)
//            {
//                _month = 1;
//                _year++;
//            }
//        }
//        return *this;
//    }
//    int _year = 2000;
//    int _month = 1;
//    int _day = 1;
//
//};
//int main() {
//    int m = 0;
//    cin >> m;
//    Date sd[100];
//    int i = 0;
//    while (m--)
//    {
//        int day = 0;
//        cin >> sd[i]._year >> sd[i]._month >> sd[i]._day;
//        cin >> day;
//        sd[i] += day;
//        i++;
//        cout << endl;
//    }
//    m = 0;
//    while (m == i)
//    {
//        cout << sd[m]._year << "-" << sd[m]._month << sd[m]._day << endl;
//    }
//    return 0;
//}
//class Solution {
//public:
//    int find(string s, char ch)
//    {
//        int i = 0;
//        for (auto ch1 : s)
//        {
//            if (ch1 == ch)
//                return i;
//            i++;
//        }
//        return 0;
//    }
//    int firstUniqChar(string s) {
//
//        int* it = new int[26];
//        for (int i = 0; i < 26; i++)
//        {
//            it[i] = 0;
//        }
//        for (auto ch : s)
//        {
//            it[ch - 'a']++;
//        }
//        for (int i = 0; i < 26; i++)
//        {
//            if (it[i] == 1)
//                return find(s, 'a' + it[i]);
//        }
//        return -1;
//    }
//};
//int main()
//{
//    string s1("leetcode");
//    Solution s;
//    s.firstUniqChar(s1);
//}
class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        string ans = "0";
        int m = num1.size(), n = num2.size();
        for (int i = n - 1; i >= 0; i--) {
            string curr;
            int add = 0;
            for (int j = n - 1; j > i; j--) {
                curr.push_back(0);
            }
            int y = num2.at(i) - '0';
            for (int j = m - 1; j >= 0; j--) {
                int x = num1.at(j) - '0';
                int product = x * y + add;
                curr.push_back(product % 10);
                add = product / 10;
            }
            while (add != 0) {
                curr.push_back(add % 10);
                add /= 10;
            }
            reverse(curr.begin(), curr.end());
            for (auto& c : curr) {
                c += '0';
            }
            ans = addStrings(ans, curr);
        }
        return ans;
    }

    string addStrings(string& num1, string& num2) {
        int i = num1.size() - 1, j = num2.size() - 1, add = 0;
        string ans;
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1.at(i) - '0' : 0;
            int y = j >= 0 ? num2.at(j) - '0' : 0;
            int result = x + y + add;
            ans.push_back(result % 10);
            add = result / 10;
            i--;
            j--;
        }
        reverse(ans.begin(), ans.end());
        for (auto& c : ans) {
            c += '0';
        }
        return ans;
    }
};
int main()
{
    string s1("2323");
    string s2("1000");
    Solution v;
    v.multiply(s1, s2);
    return 0;
}